﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLCiudades
    /// </summary>
    class BLIMPLCiudades:Presupuesto_BL.BLCiudades
    {
        DAOCiudades createCiudad = DAOFactoryPresupuesto.createCiudad();
        BLProvincias createProvincia = BLFactoryPresupuesto.createProvincia();

        /// <summary>
        /// Guarda una ciudad
        /// </summary>
        /// <param name="c">Objeto que tiene los datos de la ciudad a guardar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveCiudad(ciudadesDTO c)
        {
            Boolean correcto = false;

            try
            {
                Boolean insertado = createCiudad.saveCiudad(c.Provincia.ID, c.Nombre, c.Codigo_Postal, c.Activo);

                if (insertado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica una ciudad
        /// </summary>
        /// <param name="c">Objeto que tiene los datos de la ciudad a modificar</param>
        /// <param name="nombre">Determina la ciudad a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateCiudad(ciudadesDTO c, string nombre)
        {
            Boolean correcto = false;

            try
            {
                ciudades ciu = createCiudad.getCiudad(nombre);

                if (null != ciu)
                {
                    Boolean modificado = createCiudad.updateCiudad(c.Provincia.ID, c.Nombre, c.Codigo_Postal, c.Activo, ciu.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina una ciudad
        /// </summary>
        /// <param name="nombre">Determina la ciudad a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteCiudad(string nombre)
        {
            Boolean correcto = false;
            try

            {
                Boolean eliminar = createCiudad.deleteCiudad(nombre);

                if (eliminar)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Lista de Ciudades
        /// </summary>
        /// <returns>Devuelve una tabla con las ciudades</returns>
        public DataTable getAllCiudad()
        {
            DataTable listadoCiudades = null;

            try
            {
                DataTable ciudades = createCiudad.getAllCiudad();

                if (null != ciudades)
                {
                    listadoCiudades = ciudades;
                }
            }
            catch (Exception ex)
            {

                listadoCiudades = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return listadoCiudades;
        }

        /// <summary>
        /// Obtiene una ciudad
        /// </summary>
        /// <param name="nombre">Determina la ciudad a obtener</param>
        /// <returns>Devuelve un objeto ciudad</returns>
        public ciudadesDTO getCiudad(string nombre)
        {
            ciudadesDTO ciudad = null;

            try
            {
                ciudades ciu = createCiudad.getCiudad(nombre);
                DataTable provincias = createProvincia.getAllProvincia();
                DataTable ciudades = createCiudad.getAllCiudad();

                if (null != ciu)
                {
                    ciudad = new ciudadesDTO();
                    ciudad.Activo = ciu.Activo;
                    ciudad.Codigo_Postal = ciu.Codigo_Postal;
                    ciudad.ID = ciu.ID;
                    ciudad.Nombre = ciu.Nombre;
                    ciudad.Provincia = createProvincia.getProvincia(ciudades.Select("Nombre = '" + nombre + "'")[0]["Nombre1"].ToString());
                }
            }
            catch (Exception ex)
            {

                ciudad = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return ciudad;
        }
    }
}
